/**
 * Project threadpoll
 * @author lwj
 */


#include "ThreadPoll.h"

/**
 * ThreadPoll implementation
 */


/**
 * @param threadNum
 * @param queSize
 */
ThreadPoll::ThreadPoll(size_t threadNum, size_t queSize)
:_threadNum(threadNum)
,_queSize(queSize)
,_threads()
,_taskQue(queSize)
,isExit(false)
{

}

ThreadPoll::~ThreadPoll() {

}

/**
 * @return void
 */
void ThreadPoll::start() {
    //创建线程
    for(size_t i = 0; i < _threadNum; ++i)
    {
        _threads.emplace_back(&ThreadPoll::doTask,this);
    }
    return;
}

/**
 * @return void
 */
void ThreadPoll::stop() {
    //若主线程执行过快，现要等任务队列空时才能stop线程池，不然会有任务剩余没有执行完
    while(!_taskQue.empty())
    {
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }

    //回收线程
    isExit = true;

    //若子线程线程执行过快，则主线程没来的及改变isExit,子线程进入睡眠，所以要唤醒
    _taskQue.wakeup();
    for(size_t i = 0; i < _threadNum; ++i)
    {
        _threads[i].join();
    }
    return;
}


/**
 * @param ptask
 * @return void
 */
void ThreadPoll::addTask(Task* ptask) {
    if(ptask)
    {
        _taskQue.push(ptask);
    }

}

/**
 * @return TaskQueue*
 */
Task* ThreadPoll::getTask() {
    return _taskQue.pop();
}

/**
 * @return void
 */
void ThreadPoll::doTask() {
    while(!isExit){
        Task * task = getTask();
        if(task)
        {
            task->process();
        }
        else
        {
            cout << "ptask == nullptr" << endl;
        }
    }
    return;
}

